
#ifndef GDISP_LLD_HAL_H
#define GDISP_LLD_HAL_H

#include "stm32f10x.h"

/* DB15-DB0 pins. */
#define LCD_GPIO_Pin_DB_0		GPIO_Pin_0
#define LCD_GPIO_Pin_DB_1		GPIO_Pin_1
#define LCD_GPIO_Pin_DB_2		GPIO_Pin_2
#define LCD_GPIO_Pin_DB_3		GPIO_Pin_3
#define LCD_GPIO_Pin_DB_4		GPIO_Pin_4
#define LCD_GPIO_Pin_DB_5		GPIO_Pin_5
#define LCD_GPIO_Pin_DB_6		GPIO_Pin_6
#define LCD_GPIO_Pin_DB_7		GPIO_Pin_7
#define LCD_GPIO_Pin_DB_8		GPIO_Pin_8
#define LCD_GPIO_Pin_DB_9		GPIO_Pin_9
#define LCD_GPIO_Pin_DB_10		GPIO_Pin_10
#define LCD_GPIO_Pin_DB_11		GPIO_Pin_11
#define LCD_GPIO_Pin_DB_12		GPIO_Pin_12
#define LCD_GPIO_Pin_DB_13		GPIO_Pin_13
#define LCD_GPIO_Pin_DB_14		GPIO_Pin_14
#define LCD_GPIO_Pin_DB_15		GPIO_Pin_15

#define LCD_GPIO_PORT_DB0_DB7	GPIOC
#define LCD_GPIO_PORT_DB8_DB15	GPIOB
#define LCD_GPIO_CLK_DB0_DB7	RCC_APB2Periph_GPIOC
#define LCD_GPIO_CLK_DB8_DB15	RCC_APB2Periph_GPIOB

/* BL pin. */
#define LCD_GPIO_Pin_BL			GPIO_Pin_12
#define LCD_GPIO_PORT_BL		GPIOC
#define LCD_GPIO_CLK_BL			RCC_APB2Periph_GPIOC

/* WR pin. */
#define LCD_GPIO_Pin_WR			GPIO_Pin_10
#define LCD_GPIO_PORT_WR		GPIOC
#define LCD_GPIO_CLK_WR			RCC_APB2Periph_GPIOC

/* CS pin. */
#define LCD_GPIO_Pin_CS			GPIO_Pin_9
#define LCD_GPIO_PORT_CS		GPIOC
#define LCD_GPIO_CLK_CS			RCC_APB2Periph_GPIOC

/* RS pin. */
#define LCD_GPIO_Pin_RS			GPIO_Pin_8
#define LCD_GPIO_PORT_RS		GPIOC
#define LCD_GPIO_CLK_RS			RCC_APB2Periph_GPIOC

/* RD pin. */
#define LCD_GPIO_Pin_RD			GPIO_Pin_11
#define LCD_GPIO_PORT_RD		GPIOC
#define LCD_GPIO_CLK_RD			RCC_APB2Periph_GPIOC

#define GDISP_LLD_CHIP_SELECT_ENABLE		LCD_GPIO_PORT_CS->BRR = LCD_GPIO_Pin_CS
#define GDISP_LLD_CHIP_SELECT_DISABLE		LCD_GPIO_PORT_CS->BSRR = LCD_GPIO_Pin_CS

#define GDISP_LLD_REGISTER_SELECT_ENABLE	LCD_GPIO_PORT_RS->BRR = LCD_GPIO_Pin_RS
#define GDISP_LLD_REGISTER_SELECT_DISABLE	LCD_GPIO_PORT_RS->BSRR = LCD_GPIO_Pin_RS

#define GDISP_LLD_READ_STROBE_ENABLE		LCD_GPIO_PORT_RD->BRR = LCD_GPIO_Pin_RD
#define GDISP_LLD_READ_STROBE_DISABLE		LCD_GPIO_PORT_RD->BSRR = LCD_GPIO_Pin_RD

#define GDISP_LLD_WRITE_STROBE_ENABLE		LCD_GPIO_PORT_WR->BRR = LCD_GPIO_Pin_WR;
#define GDISP_LLD_WRITE_STROBE_DISABLE		LCD_GPIO_PORT_WR->BSRR = LCD_GPIO_Pin_WR;


#define GDISP_LCD_WRITE(data)		{\
										LCD_GPIO_PORT_DB0_DB7->ODR = ((LCD_GPIO_PORT_DB0_DB7->ODR&0XFF00)|(data&0x00FF));\
										LCD_GPIO_PORT_DB8_DB15->ODR = ((LCD_GPIO_PORT_DB8_DB15->ODR&0X00FF)|(data&0xFF00));\
									}
#define GDISP_LCD_READ()			(((LCD_GPIO_PORT_DB8_DB15->IDR)&0XFF00) |\
									((LCD_GPIO_PORT_DB0_DB7->IDR)&0X00FF))

void gdisp_lld_init_board(void);
void gdisp_lld_reset_pin(bool state);
void acquire_bus(void);
void release_bus(void);
void gdisp_lld_write_index(uint16_t data);
void gdisp_lld_write_data(uint16_t data);
uint16_t gdisp_lld_read_data(void);
void gdisp_lld_backlight(uint8_t percentage);

#endif /* GDISP_LLD_HAL_H */
